# 这个模块包含了由灯海创建的与照明相关的工具。
module DengHaiLightTools
  # 打开对话框
  def self.put_light_open_dialog
    # 如果对话框已经打开就关闭
    if DataManager.data['select_light']&.visible?
      DataManager.data['select_light'].close
      return
    end
    html_dialog = helpers_create_html_dialog('select_light', '灯库', 'select_light.html', 316, 600)
    return unless html_dialog

    # 注册命令： 获取缓存的文件信息，如果没有缓存则需要获取
    html_dialog.add_action_callback('IwantGetLightList') do |_action_context, ref_data|
      send_skp_list(html_dialog, ref_data)
    end

    # 注册命令：放置灯具
    html_dialog.add_action_callback('IwantPutLight') do |_action_context, put_file_name|
      put_skp_file(put_file_name)
    end

    # 注册命令：添加灯具
    html_dialog.add_action_callback('IwantAddLight') do
      file_path = UI.openpanel('选择一个SKP文件', '', 'SKP 文件|*.skp||')
      next unless file_path
      next if check_file(file_path)

      loaded_skp_file = check_not_mine(file_path, html_dialog)
      next unless loaded_skp_file

      open_edit_dialog(loaded_skp_file, html_dialog)
    end

    # 注册命令：删除灯具
    html_dialog.add_action_callback('IwantDelLight') do |_action_context, del_file_name|
      # put_skp_file(put_file_name)
      next if UI.messagebox("是否删除 #{del_file_name.length} 个灯具？", MB_YESNO) != IDYES

      del_file_name.each do |file|
        FileUtils.rm_f("#{LIGHT_PATH}/#{file}.light")
        FileUtils.rm_f("#{LIGHT_PATH}/#{file}.jpg")
      end
      refresh_dialog(html_dialog)
    end
  end

  # 检查文件尺寸是否满足要求
  def self.check_file(file_path)
    return unless File.size(file_path) > 204_800

    UI.messagebox('文件尺寸太大超过200Kb，请优化模型文件。')
    file_path
  end

  # 检查是否是灯海的文件
  # 如果是我们的，返回一个空，上下文判断为空就直接中断。在这个里面会直接保存，然后会释放这个临时加载的文件
  # 如果不是我们的，返回加载了的文件
  def self.check_not_mine(file_path, html_dialog)
    loaded_skp_file = load_skp_file(file_path)
    file_attr = helpers_get_attribute(loaded_skp_file) if loaded_skp_file
    if file_attr && file_attr['author'] == '重庆灯海文化'
      do_save_file(loaded_skp_file, file_attr['light_name'])
      refresh_dialog(html_dialog)
      return nil
    end
    loaded_skp_file
  end

  # 刷新html对话框的内容
  def self.refresh_dialog(html_dialog)
    send_skp_list(html_dialog, true)
  end

  # 检查并保存文件到“灯库”目录中
  # 根据文件的缩略图生成同名的浏览图
  # 首先将这个文件读入内存，然后给文件加上自定义属性。
  # 然后保存，并且导出缩略图
  # 这里需要再建一个对话框，以模态方式显示。
  def self.open_edit_dialog(loaded_skp_file, dialog_openr)
    html_dialog = helpers_create_html_dialog('edit_light', '添加灯具', 'edit_light.html', 400, 400, false)
    html_dialog.add_action_callback('IwantSetAttrOfNewLight') do |_action_context, re_data|
      # 开始检查数据合法性
      next unless check_input(re_data['channel_count'], '通道数')
      next unless check_input(re_data['universe'], '域')
      next unless check_input(re_data['dmx_address'], '地址')

      # 检查通过，开始导入文件以及修改自定义属性和保存文件
      attr_obj = {
        light_name: re_data['light_name'],
        light_category: re_data['light_category'],
        manufacturer: re_data['manufacturer'],
        channel_count: re_data['channel_count'],
        fixture_id: re_data['fixture_id'],
        universe: re_data['universe'],
        dmx_address: re_data['dmx_address'],
        author: re_data['author'],
        description: re_data['description']
      }
      helpers_set_attribute_arry(loaded_skp_file, attr_obj)
      do_save_file(loaded_skp_file, re_data['light_name'])
      refresh_dialog(dialog_openr)
      html_dialog.close
    end

    html_dialog.show_modal
  end

  # 执行保存
  def self.do_save_file(skp_file_dif, file_name)
    if File.exist?("#{LIGHT_PATH}/#{file_name}.light")
      UI.messagebox('保存失败。已有同名灯具！')
      return
    end
    skp_file_dif.name = file_name
    skp_file_dif.save_as("#{LIGHT_PATH}/#{file_name}.skp")

    skp_file_dif.save_thumbnail("#{LIGHT_PATH}/#{file_name}.jpg")
    File.rename("#{LIGHT_PATH}/#{file_name}.skp", "#{LIGHT_PATH}/#{file_name}.light")
    Sketchup.active_model.definitions.remove(skp_file_dif)
  end

  # 检查输入的属性是否合法
  def self.check_input(check_v, text)
    unless (1..512).cover?(check_v)
      UI.messagebox("'#{text}' 输入不合法，应该介于 1 到 512 之间。")
      return false
    end
    true
  end

  # 搜索指定文件夹文件，发送给对话框 ========== 这里还没完工
  def self.send_skp_list(dialog, is_refresh = nil)
    if DataManager.get('skp_files') && !is_refresh
      skp_files_data = DataManager.get('skp_files').to_json
    else
      skp_files = Dir.glob(File.join(LIGHT_PATH, '**/*.light'), File::FNM_CASEFOLD).map do |file_path|
        filename = File.basename(file_path, '.light')
        lightname = filename
        { filename: filename, lightname: lightname }
      end
      DataManager.set('skp_files', skp_files)
      skp_files_data = skp_files.to_json
    end
    dialog.execute_script("receiveDataFromRuby('#{skp_files_data}',\"#{LIGHT_PATH}\")")
  end

  # 加载并且放置文件
  def self.put_skp_file(filename)
    # 让当前的SU窗口获得焦点
    Sketchup.focus
    # 使用自定义工具放置模型
    Sketchup.active_model.select_tool(Tools::PutLight.new("#{LIGHT_PATH}/#{filename}.light"))
  end
end